package com.partsoft.dits.transform;

import java.util.List;

import com.partsoft.dits.message.DataProperty;
import com.partsoft.dits.message.MessageEntity;
import com.partsoft.dits.message.MessageException;

/**
 * 转换引擎
 */
public interface TransformReactor {

	/**
	 * 获得缺省的转换脚本文本
	 * @param tableFields 字段列表
	 */
	String getDefaultScriptContent(List<DataProperty> tableFields);
	
	/**
	 * 使用脚本对消息实体进行转换 
	 * @param scriptContent 模板文本内容
	 * @param messageEntity 消息实体
	 * @return 转换后的文本内容
	 */
	StringBuffer transform(String scriptContent, MessageEntity messageEntity) throws TransformException;
	
	/**
	 * 使用脚本对消息实体进行转换
	 * @param entity 原始消息实体
	 * @param scriptContent 转换模板内容
	 * @return 转换后的消息实体
	 * @throws MessageException 如果转换失败（不能转成目标实体 )，则抛出异常。
	 */
	MessageEntity transform(MessageEntity sourceMsg, String scriptContent) throws TransformException;
	
	/**
	 * 对传入的消息实体使用转换模板转换成消息实体的校验<br/>
	 * 转换后必须含有数据对象<br/>
	 * 数据对象的字段内容允许少于期望的字段， 但至少存在一个字段
	 * @param sourceMsg 原始消息实体
	 * @param scriptContent 转换模板内容
	 * @param expectColumns 限定的数据列列表(转换后的消息实体数据项仅在此列表中存在的），不能为空列表或null
	 * @throws MessageException 成功转换但如果出现不在限定列表({@link expectColumns})中的数据列则跑出异常
	 */
	MessageEntity validateTransformMessageEntity(MessageEntity sourceMsg, String scriptContent, List<DataProperty> expectColumns) throws TransformException;
	
	/**
	 * 对传入的消息实体使用转换模板转换成消息实体的校验<br/>
	 * 转换后必须含有数据对象<br/>
	 * 数据对象至少存在一个字段
	 * @param sourceMsg 原始消息实体
	 * @param scriptContent 转换模板内容
	 * @param allowLose 是否允许少于期望的字段 
	 * @param expectColumns 限定的数据列列表(转换后的消息实体数据项仅在此列表中存在的），不能为空列表或null
	 * @throws MessageException 成功转换但如果出现不在限定列表({@link expectColumns})中的数据列则跑出异常
	 */
	MessageEntity validateTransformMessageEntity(MessageEntity sourceMsg, String scriptContent, List<DataProperty> expectColumns, boolean allowLose) throws TransformException;

	/**
	 * 对传入的消息实体使用转换模板转换成消息实体的校验<br/>
	 * 转换后必须含有数据对象<br/>
	 * 数据对象的字段内容允许少于期望的字段， 但至少存在一个字段
	 * @param sourceMsg 原始消息实体
	 * @param scriptContent 转换模板内容
	 * @param expectColumns 限定的数据列列表(转换后的消息实体数据项仅在此列表中存在的），不能为空列表或null
	 * @throws MessageException 成功转换但如果出现不在限定列表({@link expectColumns})中的数据列则跑出异常
	 */
	MessageEntity validateTransformMessageEntity(MessageEntity sourceMsg, String scriptContent, DataProperty[] expectColumns) throws TransformException;
	
	/**
	 * 对传入的消息实体使用转换模板转换成消息实体的校验<br/>
	 * 转换后必须含有数据对象<br/>
	 * 数据对象至少存在一个字段
	 * @param sourceMsg 原始消息实体
	 * @param scriptContent 转换模板内容
	 * @param allowLose 是否允许少于期望的字段 
	 * @param expectColumns 限定的数据列列表(转换后的消息实体数据项仅在此列表中存在的），不能为空列表或null
	 * @throws MessageException 成功转换但如果出现不在限定列表({@link expectColumns})中的数据列则跑出异常
	 */
	MessageEntity validateTransformMessageEntity(MessageEntity sourceMsg, String scriptContent, DataProperty[] expectColumns, boolean allowLose) throws TransformException;

	
}
